# -*- coding: utf-8 -*-

from django.db import models
from django.contrib.auth.models import Group, User
from estoque.models import Produto, Setor
from cliente.models import Cliente

class Mesa(models.Model):
    class Meta:
        permissions = (
            ("unir_mesas", "Pode unir mesas"),
        )
        
    nome = models.CharField(u'Nome da Mesa', max_length=20)
    tipo = models.IntegerField(u'Tipo de Mesa', choices = ( (1, 'Local'), (2, 'Entrega'), (3, 'balcão') ), default = 1)
    setor = models.ForeignKey(Setor)
    porcentagem = models.DecimalField(u'Porcentagem', max_digits = 10, decimal_places = 3, default = 0)

    def __unicode__(self):
        return self.nome
class Pedido(models.Model):
    class Meta:
        permissions = (
            ("dar_desconto", "Pode dar descontos"),
            ("novo_pedido", "Pode criar um novo pedido"),
            ("alterar_pedido", "Pode alterar um pedido"),
            ("fechar_pedido", "Pode fechar um pedido"),
            ("alterar_taxa", "Pode retirar taxa de serviço"),
            ("alterar_mesa", "Pode alterar mesa do pedido"),
            ("imprimir_parcial", "Pode imprimir parcial")
        )
        
    dia = models.ForeignKey('Dia_funcionamento', default = 1)
    mesa = models.ForeignKey(Mesa, null=True, blank=True)
    numero_pessoas = models.IntegerField(null=True, blank=True, default=0)
    total = models.DecimalField(u'Preço Total', max_digits=10, decimal_places=2, default = 0)
    aberto = models.DateTimeField(u'Data de abertura', auto_now_add = True)
    fechado = models.DateTimeField(u'Data de Fechamento', blank = True, null = True, default = None)
    desconto = models.CharField(u'Desconto', null=False, blank=True, max_length=10, default = '0')
    #Quem abre o pedido (ex. garçon)
    usuario = models.ForeignKey(User, null=True, blank=True)
    #Cliente do estabelecimento
    cliente = models.ForeignKey(Cliente, null=True, blank=True, default = None)
    taxa_servico = models.BooleanField(u'Taxa de serviço', default = True)
    
    def save(self, *args, **kwargs):
        self.desconto = str(self.desconto).strip()
        if self.desconto != '0':
            permitidos = '0123456789,.% '
            desconto = self.desconto.strip()
            
            descontovalido = True
            for i in range(len(desconto)):
                if permitidos.find(desconto[i]) == -1:
                    request.session['aviso'] = 'Desconto inválido!'
                    self.desconto = '0'

                    descontovalido = False
                    break

            if descontovalido:
                desconto = desconto.replace(',', '.')
                desconto = desconto.replace(' ', '')
                if desconto.count('.') > 1:
                    desconto = desconto.replace('.', '', desconto.count('.') -1)

                ultimo = desconto[len(desconto)-1]
                if ultimo == '%':
                    desconto = float(desconto.replace('%', ''))
                    desconto = float(self.total) * desconto / 100
    
                desconto = float(desconto)
                
                self.desconto = round(desconto, 3)
                
#                print desconto
#                print self.desconto
                if round(desconto, 3) > round(float(self.total), 3):
                    self.desconto = '0'
        
        super(Pedido, self).save(*args, **kwargs)
    
    def __unicode__(self):
        return 'Pedido %s' % str(self.id)

class Item(models.Model):
    """
    estado = 0; Produto excluido da lista
    estado = 1; Produto existe
    estado = 2; Produto existe e foi pedido(processado)
    estado = 3; Produto não será cobrado
    estado = 4; Produto já foi pago
    """
    class Meta:
        verbose_name_plural = "Itens"
        
        permissions = (
            ("excluir_item", "Pode excluir um item"),
            ("excluir_item_confirmado", "Pode excluir um item confirmado"),
        )

    pedido = models.ForeignKey(Pedido)
    produto = models.ForeignKey(Produto)
    quantidade = models.DecimalField('Quantidade', max_digits=10, decimal_places=3)
    estado = models.IntegerField(default=1, choices = ((0, 'Item excluído da lista'), (1, 'Item está na lista'), (2, 'Item processado'), (3, 'Grátis'), (4, 'Pago'),))
    usuario = models.ForeignKey(User, null=True, blank=True)
    data = models.DateTimeField(u'Horário do pedido', auto_now_add = True)
    observacao = models.TextField('Observação', blank=True, null=True, default = '')

    def __unicode__(self):
        return self.produto.descricao

class Dia_funcionamento(models.Model):
    '''
    Agora é caixa
    '''
    
    class Meta:
        verbose_name_plural = "Dias de Funcionamento"
        
        permissions = (
            ("abrir_caixa", "Pode abrir caixa"),
            ("fechar_caixa", "Pode fechar caixa"),
        )
    
    aberto = models.DateTimeField()
    fechado = models.DateTimeField(null=True, blank=True)
    evento = models.TextField(max_length=50, null=True, blank=True)
    setor = models.ForeignKey(Setor, default = 1)
    
    # Vamos transformar isto em um caixa
    valor_inicial = models.DecimalField(u'Valor inicial', max_digits = 10, decimal_places = 2, default = 0)
    
    dinheiro = models.DecimalField(u'Valor final em dinheiro', max_digits = 10, decimal_places = 2, default = 0)
    debito = models.DecimalField(u'Valor final em débito', max_digits = 10, decimal_places = 2, default = 0)
    cartao = models.DecimalField(u'Valor final em cartão (crédito)', max_digits = 10, decimal_places = 2, default = 0)
    cheque = models.DecimalField(u'Valor final em cheque', max_digits = 10, decimal_places = 2, default = 0)
    crediario = models.DecimalField(u'Valor final em crediário', max_digits = 10, decimal_places = 2, default = 0)
    
    # Recebimentos de contas
    recebimento_dinheiro = models.DecimalField(u'Valor final recebido em dinheiro', max_digits = 10, decimal_places = 2, default = 0)
    recebimento_debito = models.DecimalField(u'Valor final recebido em débito', max_digits = 10, decimal_places = 2, default = 0)
    recebimento_cartao = models.DecimalField(u'Valor final recebido em cartão (crédito)', max_digits = 10, decimal_places = 2, default = 0)
    recebimento_cheque = models.DecimalField(u'Valor final recebido em cheque', max_digits = 10, decimal_places = 2, default = 0)
    
    # Entrada/Saída
    recebimento = models.DecimalField(u'Valor final em dinheiro dos recebimentos', max_digits = 10, decimal_places = 2, default = 0)
    pagamento   = models.DecimalField(u'Valor final em dinheiro dos pagamentos', max_digits = 10, decimal_places = 2, default = 0)
    
    def __unicode__(self):
        if unicode(self.evento).strip() != '':
            return unicode(self.evento)
        else:
            return str(self.aberto.strftime('%d/%m/%Y - %H:%M'))

class Movimentacao(models.Model):
    dia = models.ForeignKey(Dia_funcionamento)
    valor = models.DecimalField(u'Valor', max_digits = 10, decimal_places = 2, default = 0)
    usuario = models.ForeignKey(User, null = True, blank = True, default = None)
    observacao = models.TextField(u'Observação', default = '')
    tipo = models.BooleanField(u'True = Retirar, False = Receber', default = True)

class Pagamento_parcial(models.Model):
    class Meta:
        verbose_name_plural = 'Pagamentos parciais'
        verbose_name = 'Pagamento parcial'
        
        permissions = (
            ("ver_pagamento", "Pode visualizar pagamento"),
            ("adicionar_pagamento", "Pode adicionar pagamento"),
            ("excluir_pagamento", "Pode excluir pagamento"),
        )
        
    pedido = models.ForeignKey(Pedido)
    
    valor = models.DecimalField(u'Valor', max_digits=10, decimal_places=2)
    estado = models.IntegerField(default=1, choices = ((0, 'Item excluído da lista'), (1, 'Item está na lista'),))
    tipo = models.IntegerField(default=0, choices = ((0, 'Dinheiro'), (1, 'Débido'), (2, 'Cartão (Crédito)'), (3, 'Cheque'), (4, 'Crediário'),))
    data = models.DateTimeField(u'Data do pagamento', auto_now = True)
    
    def __unicode__(self):
        if self.tipo == 0:
            tipo = u'dinheiro'
        elif self.tipo == 1:
            tipo = u'débito'
        elif self.tipo == 2:
            tipo = u'cartão'
        elif self.tipo == 3:
            tipo = u'cheque'
        elif self.tipo == 4:
            tipo = u'crediario'
        else:
            tipo = u'crediario recebido'
        
        return (u'R$ %.2f %s' % (self.valor, tipo)).replace('.', ',')
            
class Pagamento(models.Model):
    dia = models.ForeignKey(Dia_funcionamento, related_name="Dia de funcionamento", null = True, blank = True, default = 1)
    cliente = models.ForeignKey(Cliente, null = True, blank = True)
    usuario = models.ForeignKey(User, null = True, blank = True)
    valor = models.DecimalField(u'Valor', max_digits = 10, decimal_places = 2)
    estado = models.IntegerField(default=1, choices = ((0, 'Item excluído da lista'), (1, 'Item está na lista'),))
    tipo = models.IntegerField(default=1, choices = ((1, 'Entrada'), (2, 'Saida)'),))
    data = models.DateTimeField(u'Data do pagamento')
    observacao = models.TextField(u'Observação', null = True, blank = True, default = '')

# class Direcionamento(models.Model):
#     usuario  = models.ForeignKey(User)
#     atual    = models.CharField(u'Página atual', max_length = 100, null = True, blank = True, default = '')
#     link     = models.CharField(u'Link', max_length = 100, null = True, blank = True, default = '')
#     proxima  = models.CharField(u'Próxima página', max_length = 100, null = True, blank = True, default = '')
#     anterior = models.CharField(u'Página anterior', max_length = 100, null = True, blank = True, default = '../')
#     